package cn.lycode.system.service;


import cn.lycode.common.core.domain.entity.SysMenu;
import cn.lycode.common.core.domain.model.ConditionDTO;
import cn.lycode.common.core.domain.model.SelectIdsDTO;
import cn.lycode.system.domain.dto.sysmenu.MenuPermissionDTO;
import cn.lycode.system.domain.vo.MenuTreeVO;
import cn.lycode.system.domain.vo.SysMenuVO;

import java.util.List;
import java.util.Set;

/**
 * 菜单 业务层
 *
 * @author lyCode
 */
public interface SysMenuService {

    /**
     * 查询全部的菜单列表
     * 用于前端菜单路由
     * @return
     */
    List<SysMenuVO> selectFrontMenuAll();

    /**
     * 查询用户拥有的菜单列表，
     * 用于前端菜单路由
     * @param userId 用户ID
     * @return 菜单路由列表
     */
    List<SysMenuVO> selectFrontMenusByRoleName(String roleName);

    /**
     * 根据角色标识（角色名）获取菜单权限标识列表，
     * 用于安全框架的权限列表获取
     * @param roleName 角色名
     * @return 菜单权限字符串列表
     */
    Set<String> selectMenuPermsByRoleFlag(String roleName);

    /**
     * 查询系统菜单列表
     */
    List<SysMenuVO> selectMenuList(ConditionDTO conditionDTO);


    /**
     * 根据菜单ID获取菜单详细信息
     */
    SysMenu selectMenuById(Long id);

    /**
     * 添加菜单
     */
    int addMenu(SysMenu menu);

    /**
     * 删除菜单
     */
    void remove(SelectIdsDTO dto);

    /**
     * 修改菜单
     */
    int updateMenu(SysMenu menu);

    /**
     * 获取添加\修改菜单要用上级菜单列表
     */
    List<MenuTreeVO> getSimpleMenuTree();

    /**
     * 获取编辑角色权限要用的菜单树
     */
    List<MenuTreeVO> queryRoleMenuTree();

    boolean hasExistsPerms(MenuPermissionDTO dto);

}
